﻿/**
* 基于软件的定时器,依赖CPU,需轮询
 * @author Zr
 */
#pragma once
#include <xscugic.h>
#include <xscutimer.h>

#include <functional>
#include <map>
#include <string>

#include "ZTimerCommon.h"

class ZTimerSW {
  // 单个任务
  struct TaskInternal {
    // 任务名称
    std::string name{};
    // 任务回调函数
    std::function<void()> callback{nullptr};
    // 任务周期,单位ms
    unsigned long period{1000};
    // 过去的时间,单位ms
    unsigned elapsedTime{0};
  };

public:
  /**
   * @param period 基础的计时的周期,单位ms
   * @param cpuFreq cpu的主频,单位Hz
   */
  explicit ZTimerSW();

  /**
   * 添加一个任务,任务名要求唯一
   * @param task 任务
   */
  void add(Task task);

  /**
   * 删除1个任务
   * @param taskName 任务名称
   */
  void remove(const std::string &taskName);

  /**
   * 执行一次逻辑,如果有任务到期,则执行任务回调函数,需要放在循环中,会一直轮询
   */
  void runOnce();

  /**
   * @return 当前的时间,单位ms
   */
  static unsigned curTime();

private:
  /**
   * 初始化
   */
  void initialize();


private:
  // 定时器中断回调函数
  std::map<std::string, TaskInternal> callbacks_;

  // 上一次的时间,单位ms
  unsigned lastTime_{0};
};